home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 73
/
PCMania CD73_1.iso
/
sharewar
/
varios
/
partial
/
REGALOS
/
VIRUS
/
DTA.TXT
< prev
next >
Wrap
Text File
|
1996-01-05
|
7KB
|
145 lines
--- SERVICIOS AVANZADOS DE DISCO ---
Un usuario con los servicios básicos de acceso a ficheros (abrir,cerrar...)
puede acceder con facilidad a un fichero una vez que conoce su nombre.
Sin embargo gracias a servicios más avanzados de disco podemos obtener
por ejemplo la lista de ficheros de un directorio, etc.
Estos servicios son ofrecidos por el sistema operativo (DOS), que devuelve
los datos en un buffer denominado DTA ( Area de Transferencia de disco,
o para los internacionales, Disk Transfer Area ). Estos datos se encuentran
localizados al principio del bloque de memoria reservado para el programa.
Más concretamente son los primeros 256 bytes de este bloque los que son
utilizados por el DOS para pasar algunos datos a nuestro programa.
El DTA se puede localizar a la entrada de nuestro código ya que en este
momento el registro ES apunta a estos datos.
Como acceder a ella?, el DTA se encuentra en el desplazamiento 80h
por tanto según lo que busquemos así nos tendremos que desplazar dentro
del DTA.
Imaginemos que buscamos un fichero por ejemplo COM, entonces le diremos
al programa que busque el primer fichero que coincida con esta especificación,
si lo encuentra, se pasa una cadena ASCIIZ ( es decir, el nombre del fichero
más un último byte a 0 ). Entonces el DOS retorna en la DTA los datos del
fichero encontrado, si por casualidad quisieramos seguir buscando ficheros,
le diríamos al programa que buscara el proximo fichero coincidente ( esto
se puede hacer mediante la función 4eh (Buscar la primera entrada) o
4fh (Buscar la próxima entrada), de la int.21h , por si acaso desconoces
estas funciones se cargan en AH ). Si por el contrario no encuentra ningún
fichero, retorna un código de error (activa el flag de acarreo), y más
concretamente 12h en AX, con lo que la busqueda concluye.
Todo lo que podemos acceder a través del DTA queda mostrado en la siguiente
tabla:
Desplazamiento ( a partir de 80h) Longitud ( en Bytes ) Contenido
--------------------------------- --------------------- ---------
0 d o 0h 21 Reservado
21 d o 15h 1 Atributos de fichero
22 d o 16h 2 Hora de creación
24 d o 18h 2 Fecha de creación
26 d o 1Ah 4 Tamaño
30 d o 1Eh 14 Nombre.ext ( en Ascciz )
d -> valor decimal h-> valor hexadecimal
Los primeros 21 bytes de la DTA, después de invocar un servicio para la
busqueda del primer fichero coincidente, son rellenados por el DOS con
información para el uso de llamadas posteriores a la busqueda de otro
archivo, por este motivo no se deben modificar. Los siguientes 22 bytes de
DTA, contienen los datos del fichero coincidente encontrado, refiriéndonos
a ellos según la tabla anterior. Por tanto, sólo los primeros 43 bytes
son utilizados por estas llamadas al MS-DOS.
Por otro lado cuando queramos acceder a estos campos de la DTA, tendremos
que tener en mente unas cuantas cuestiones:
a) La fecha está compuesta de dos bytes, de este modo la referencia
de año,mes,dia en cuanto a los bits que componen los bytes de la fecha
serían los siguientes:
15........8.....5........0 Bits
Año Mes Dia
b) La hora está compuesta por dos bytes, al igual que la fecha, accedemos
a sus datos del siguiente modo, teniendo en mente su localización:
15........11.......5.......0 Bits
Hora Minuto Seg
Ejemplos prácticos del uso del DTA
----------------------------------
Vamos ahora a explicar unas líneas de código del virus tratado que hace
referencia al DTA:
mov cx, 43d ;Salva DTA original
lea di, bp + DTA_orig
mov si, 0080h
rep movsb
Para que hace esto el virus tratado, es sencillo, mediante una instrucción
rep movsb copia 43 bytes ( que vienen indicado en CX ) del desplazamiento
80h del segmento ES ( recorda que ES apunta al DTA al inicializar
el programa y no tiene mayor problema ), es decir, copia los 43 bytes
originales de la DTA, pues en cada llamada para buscar un fichero coincidente
ya sea el primero u otro posterior, estos datos son actualizados con datos
del fichero encontrado.
De este modo el virus se asegura poder retornar el contenido exacto del DTA.
mov ax, 03d02h
mov dx, 0009eh ;Abre el file encontrado
int 021h
Con estas instrucciones el virus abre el fichero encontrado, en ax se encuentra
la función oportuna, pero lo que nos interesa, en DX se muestra el desplazamiento
para acceder al nombre del fichero a través de la DTA. El desplazamiento
es 09eh, es decir, 80h + 30d ( = 1eh), por tanto os daréis cuenta que
para acceder a un campo determinado se le suma al desplazamiento que apunta
inicialmente al DTA ( 80h) el valor donde se encuentra la zona a consultar,
de este modo 80h + 1eh = 09eh (1eh es el desplazamiento que indica el contenido
del nombre.ext del fichero, es decir, 30d), de este modo obtenemos el nombre
del fichero a través del DTA.
mov cx, 2 ;Calcula el jmp para el virus
mov si, 009ah ;(longitud del prog. + 1)
lea di, bp + Longitud
rep movsb
add Longitud + bp,1
Por último vamos a ver estas líneas, aquí se muestra como el virus calcula
la longitud para el jump que saltará al código del virus, pero bueno
esto ahora no nos interesa, veamos su función con el DTA.
En SI se encuentra el valor 09ah, que es igual a 80h + 26d ( = 1ah),
80h + 1ah = 09ah, de este modo accedemos al tamaño del fichero a través del
DTA.
Como se pueden dar cuenta las utilidades del uso del DTA son cuantiosas,
desde las mostradas hasta, por ejemplo, imaginen que interceptamos las
funciones que tiene uso por ejemplo el comando DIR del DOS ( las funciones
11h y 12h de la int.21h). En este caso supongamos que tenemos un virus
residente que cada vez que se llame a esta funciones acceda a través del
DTA al fichero/os solicitados y obtenga su tamaño, le reste el tamaño
del virus y lo guarde en su mismo lugar. De este modo el usuario mediante
el comando DIR u otro comando que utilice estas funciones nunca se dará
cuenta del incremento que tiene su fichero, pues el siempre verá el mismo.
Como este procedimiento, todos los que os imaginéis....
Bueno con esto hay suficiente, hasta el próximo número.
HANDLER